<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<!-- <link rel="stylesheet" href="./editor.css">
<link rel="stylesheet" href="./quill.bubble.css">
<link rel="stylesheet" href="./quill.core.css">
<link rel="stylesheet" href="./quill.snow.css"> -->
<style>
  
  .p {
    color: red;
    background: black;
  }


</style>
<body>
    <!-- <div class="wrapper">
           <button id="btn">btn</button>
    </div> -->
   <!-- <img src="http://106.14.33.163:8888/group1/M00/00/17/ag7Hml1KimKAEnVnAAIMl5h4R2Q75.jpeg" alt=""> -->
   <div >
            <div class="content"></div>
   </div>
</body>
<script>

function add() { let num  = 1; return function() { num ++;console.log(num)}}

let cc = add()

// var arr1 = [2,5,6,9,8,7,1,4]

// function findOn(arr,k) {
//   let len = arr.length
//   for(let i = 0; i < k; i++) {
//      let temp = ''
//      for(let j = i; j < len; j ++) {
//         if(arr[i] < arr[j]) {
//            temp = arr[i]
//            arr[i] = arr[j]
//            arr[j] = temp
//         }
//      }
//   }
//   return arr[k-1]
// }


// function findOn(arr,k) {
//   let len = arr.length
//   for(let i = 0; i < arr.length-k; i++) {
//     let temp;
//     for(let j = 0; j < arr.length; j++) {
//        if(arr[j] < arr[j+1]) {
//          temp = arr[j]
//          arr[j] = arr[j+1]
//          arr[j+1] = temp
//        }
//     }
//   }
//    return arr[arr.length-k+1]
// }
  
// var arr = [2,5,6,9,8,7,1,4]

// function od(arr) {
//     arr.sort((a,b) => a -b)
//     let d = 0
//     let s = 1
//     let temp = []
//     for(let i = 0; i < arr.length; i++){
//         if(arr[i]%2 === 1) {
//             temp.push(arr[s])
//             s += 2
//         } else {
//             temp.push(arr[d])
//             d+=2
//         }
//     }
//    return temp
// }


// let top = {
//   id:0,
//   parentId:-1
// }
// function tree(arr,obj) {
//    obj.children = []
//    for(var i = 0; i < arr.length; i++) {
//      if(obg.id === arr[i].parentid) {
//          obj.children.push(arr[i])
//          tree(arr,arr[i])
//      }
//    }
// }





// let con = document.getElementsByClassName('content')[0]

// let wrapper = document.getElementsByClassName('wrapper')[0]

// let head = ` `


// wrapper.innerHTML = `<p>
//        <span id='foo'>111111</span>
//     </P>`

// var span =  document.querySelector('span')
// var span1 = document.getElementsByTagName('span')

// var insertSpan = document.createElement('span')
// wrapper.appendChild(insertSpan)


// function add(a,b) {
//     return new Promise((resolve,reject) => {
//         var num = a + b
//         if(num > 5) {
//             setTimeout(() => {
//                 resolve(num)    //resolveed
//             },1000)

//         } else {
//           reject(num)      //rejected
//         }
//     })
// }


// let num = add(5,1).then(res =>{
//     console.log(res)
//     return new Promise((resolve,reject) => {
//         reject(111)
//     })
// }).catch(err => {
//     console.log(err)
// })

// num.catch(err => {
//     console.log(err)
// })

// let demo = add(2,2).then(res => {
//     return res
// }).catch(err => {
//     return err
// })



// demo.then(res => {
//     console.log(res)
// })




// let a = 3
// let b = 8



// console.log(a > 5 || b > 10)    //如果前面的为false，打印后面的

// console.log(a > 1 && b > 6)    //如果前面的为true，打印后面的

// obj = {
//     brandId:'100011',
//     brandName:'风云管家'
// }


// let { brandId, brandName }  = obj
// let { this.brandId } = item



// let arr = [111,10,2,4,5,8,9,70,41,1]





// Array.prototype.bubbleSort = function() {
//     let len = this.length
//    for(let i = 0;i< len;i++) {
//        for(let j = 0;j < len; j++){
//            if(this[j] > this[j+1]) {
//                let temp = this[j]
//                this[j] = this[j+1]
//                this[j+1] = temp
//            }
//        }
//    }
//    return this
// }





// //选择排序
// function select(data) {
//    let arr = data
//    for(let i = 0;i< arr.length;i++) {
//        for(let j = i;j < arr.length; j++){
//            if(data[i] > data[j]) {
//                let temp = data[i]
//                data[i] = data[j]
//                data[j] = temp
//            }
//        }
//    }
//    return arr
// }



// //插入排序
// function insertionSort(arr) {
//     for(let i = 1;i < arr.length; i++) {
//         let j = i - 1
//         let temp = arr[i]
//         while(arr[j] > temp && j >= 0) {
//             arr[j+1] = arr[j]
//             //console.log(arr[j+1])
//             j--
//         }
//         //console.log(arr[j+1],j,j+1)
//         arr[j+1] = temp
//     }
//     return arr
// }
// let textArr = [111,21,8,48,36,87,99,76]



// console.log(insertionSort(textArr))
// let textArr = [111,21,8,48,36,87,99,76]
// console.log(insertionSort(textArr))
// //插入排序
// function insertionSort(arr) {
//    for(var i = 1; i < arr.length; i++){
//      let temp = arr[i]
//      for(var j = i-1; j >= 0; j--){
//          if(arr[j] > temp) {
//              arr[j+1] = arr[j]
//          } else {
//              break
//          }
//      }
//      arr[j+1] = temp
//    }
//    return arr
// }


// function insertionSort(arr) {
//     for(let i = 1; i < arr.length; i++) {
//         let temp = arr[i]
//         for(var j = i - 1; j >= 0 && arr[j] > temp; j--) {
//             arr[j+1] = arr[j]
//         }
//         arr[j+1] = temp
//     }
//     return arr
// }


// function quickSort(arr) {
//      if(arr.length < 1) {
//         return arr
//      }
// 　　 var pivot = arr[0]
//      let left = []
//      let right = []
//      for(let i = 1; i < arr.length; i++) {
//          if(arr[i] < pivot){
//             left.push(arr[i])
//          } else {
//             right.push(arr[i])
//          }
//      }
//      return quickSort(left).concat(pivot).concat(right)
// }
// console.log(quickSort(textArr))


  //希尔排序
// function shellSort(arr) {
//     let len = arr.length
//     let temp;
//     let gap = Math.floor(len/2)   //4
//     while(gap >= 1){
//         for(let i = gap; i < len; i++) {
//            var j;
//            temp = arr[i]
//            for(j= i-gap; j >=0 &&temp < arr[j]; j=j-gap) {
//                arr[j+gap] = arr[j]
//            }
//            arr[j+gap] = temp
//         }
//         gap = Math.floor(gap/2)
//     }
//     return arr
// }


// let textArr = [111,21,8,48,36,87,99,76]
// function shellSort(arr) {
//     let len = arr.length
//     let temp;
//     let gap = Math.floor(len/2)
//     while(gap >= 1){
//         for(let i = gap; i < len; i++) {
//            var j;
//            temp = arr[i]
//            for(j = i-gap; j >=0 &&temp < arr[j]; j=j-gap) {
//                arr[j+gap] = arr[j]
//            }
//            arr[j+gap] = temp
//         }
//         gap = Math.floor(gap/2)
//     }
//     return arr
// }
// console.log(shellSort(textArr))


// let textArr = [111,21,8,48,36,87,99,76]
// function shellSort(arr) {
//    let len = arr.length
//    let gap = Math.floor(len/2)
//    while(gap >= 1) {
//        for(let i = gap; i < len; i++) {
//            let temp = arr[i] 
//            for(var j = i - gap; j >= 0 && arr[j] > temp; j = j - gap) {
//                arr[gap+j] = arr[j]
//            }
//            arr[j+gap] = temp
//        }
//        gap = Math.floor(gap/2)
//    }
//    return arr
// }
// console.log(shellSort(textArr))


// function dynFib(n) {
//     let arr = new Array(n)
//     if(n === 1 || n === 2) {
//         return 1
//     } else {
//         let i
//         for(i = 3; i <= n; i++) {
//             arr[i] = arr[i-1] + arr[i-2]
//         }
//         return arr[i-1]
//     }
// }

// function recurFib(n) {
//     if(n < 2) {
//         return n
//     } else {
//         return recurFib(n-1) + recurFib(n-2)
//     }
// }


// function selectSort(arr) {
//     let len = arr.length
//     for(let i = 0; i < len; i++) {
//         for(let j = i; j < len; j++) {
//             if(arr[i] > arr[j]) {
//                 let temple = arr[i]
//                 arr[i] = arr[j]
//                 arr[j] = temple
//             }
//         }
//     }
//     return arr
// }


// let textArr = [111,21,8,48,36,87,99,76]
// console.log(selectSort(textArr))


// function max(a,b) {
//     return (a > b) ? a : b
// }

// function knapask(capacity, size, value, n) {
//     if(n === 0 || capacity === 0) {
//         return 0
//     }
//     if(size[n-1] > capacity) {
//         return knapask(capacity, size, value, n-1)
//     } else {
//         return max( 
//             value[n-1] + knapask(capacity-size[n-1], size, value, n-1),           knapask(capacity, size, value, n-1)
//         )
//     }
// }

// var value = [4,5,10,11,13]
// var size = [3,4,7,8,9]
// var capacity = 16
// var n = 5
// console.log( knapask(capacity, size, value, n) )
// var a = 11

// function foo() {
//     console.log(a)
//     var a = 22
//    // console.log(a)
// }
// foo()
// console.log(a)


// var obj = {
//     a:'obj',
//     foo:foo
// }

// var obj2 = {
//     a:"obj2",
//     obj:obj
// }


// function foo() {
//     console.log(this.a)
// }

// obj2.obj.foo()




//  let treeTop = {
//     id:1,
//     parentId:0
//  }
//  var arr = [
//      {
//          id:2,
//          parentId:1
//      },
//      {
//          id:3,
//          parentId:1
//      },
//      {
//          id:4,
//          parentId:2
//      },
//      {
//          id:5,
//          parentId:3
//      },
//      {
//          id:6,
//          parentId:3
//      },
//      {
//          id:7,
//          parentId:5
//      },
//      {
//          id:8,
//          parentId:1
//      }
//  ]
//  function tree(arr,treeTop) {
//      treeTop.tree = []
//      for(var i = 0; i < arr.length; i++) {
//          if(treeTop.id === arr[i].parentId) {
//               treeTop.tree.push(arr[i])
//               tree(arr,arr[i])
//          }
//      }
//  }
//  tree(arr,treeTop)



// Function.prototype.Mybind = function(Othis) {
//     if(typeof this !== 'function') {
//         throw new TypeError('is not function')
//     }
//     var args = Array.prototype.slice.call(arguments, 1)
//     var fToBind = this
//     var fNOP = function() {}
//     var fBound = function() {
//         return fToBind.apply(
//             (this instanceof fNOP && Othis ? this : Othis),args.concat(
//                 Array.prototype.slice(arguments)
//             )
//         )
//     }
//     fNOP.prototype = this.prototype
//     fBound.prototype = new fNOP()
//     return fBound 
// }

// var obj = {
//     x:'111'
// }
// function show() {
//     console.log(this.x)
// }
// show.bind(obj)


// var list = {
//     init() {
//        this.msg = 'life is shit'
//        this.dom = document.getElementById('btn')
//        this.bindEvent()
//     },
//     bindEvent(){
//        this.dom.onclick = this.showMessage.bind(this)
//     },
//     showMessage() {
//         console.log(this)
//         //alert(this.msg)
//     }
// }
// list.init()




// var x = 10
// function show(a, b) {
//      console.log(this.x, a, b)
// }

// show('a','b')

// var obj = {
//     x:20
// }

// var newShow = show.bind(obj,'c','d')
// newShow()


// var newShow = show.bind(obj,'c')
// newShow('d')




// var list = {
//     init() {
//        this.msg = 'life is shit'
//        this.dom = document.getElementById('btn')
//        this.bindEvent()
//     },
//     bindEvent(){
//        this.dom.onclick = this.showMessage.bind(this,'kaikai', 'erhuo')
//     },
//     showMessage(infor1, infor2) {
//         console.log(this.msg, infor1, infor2)
//         //alert(this.msg)
//     }
// }
// list.init()





//总结bind
  //函数调用bind方法的时候，传递的参数

    // Function.prototype.newBind = function(target) {
    //     //target   改变返回函数的this的指向
    //     var self = this
    //     var temp = function() {}
    //     var arg = [].slice.call(arguments,1)
    //     var f = function() {
    //             //执行的是self


    //             //  用new执行时间  this ---> new f()
    //             var _arg = [].slice.call(arguments,0)   //调用f时的arguments
    //             return self.apply( this instanceof temp ? this : (target || window), arg.concat(_arg))
    //     }
    //     temp.prototype = self.prototype    //temp的原型链等于 f的原型链
    //     f.prototype = new temp()
    //     return f
    // }





    // Function.prototype.newBind = function(target) {
    //     var self = this
    //     var arg = [].slice.call(arguments,1)
    //     function temp() {}
    //     var f = function() {
    //         var _arg = [].slice.call(arguments,0)
    //         return self.apply(this instanceof temp ? this :(target || window), arg.concat(_arg))
    //     }
    //     temp.prototype = self.prototype
    //     f.prototype = new temp()
    //     return f
    // }



    // var x = 10
    // function show() {
    //     console.log(this.x)
    // }


    // var obj = {
    //     x:20
    // }

    // var newShow = show.bind(obj)
    
    
    // console.log(new newShow().constructor)


    // var obj = {
    //     a:222
    // }
    

    // // Object.preventExtensions(obj)
    // // obj.c = 3



    // Object.freeze(obj)


    // function newM(){

    // }
    // var n = new newM()
   
     




//es6的class  构造函数的二次回顾
   
      //核心  class constructor static extends super


    //   class Plane {         //typeof Plane === 'function'
    //       static name() {  //静态属性    console.log(Plane.name())   
    //           return 'static'
    //       }
    //       constructor(name) {
    //          this.name = name || '普通飞机'
    //          this.blood = 100
    //       }
    //       fly() {
    //            console.log(this.name)
    //       }
    //   }

    //   var oPan = new Plane()
    //   console.log(oPan)



    //   //继承
    //   class AttackPlane extends Plane {    //继承原型和私有属性   静态属性的继承AttackPlane.name()
    //       constructor(name) {
    //            super(name)   //继承
    //            this.log = 'can bom bom bom'
    //       }
    //       dan() {
    //           console.log('biu biu biu biu')
    //       }
    //       sayName() {
    //           console.log(this.name)
    //       }
    //   }

    //   var attack = new AttackPlane('attack')
    //   console.log(attack.fly())
      


    // var str = 'foo'
    // var cc = Array.prototype.join.call(str,'-')
    // console.log(cc,typeof cc)



       //运算符


     

       //迭代器 Iterator


//迭代模式
      //提供一种方法，可以访问聚合对象中的各个元素，是一种常见的设计者模式，它可以让用户透过特定的接口巡回
      // 访问集合中的每个元素，而不关心底层原理

//迭代器简介：

      //依照迭代器的思想实现，分为内部迭代器和外部迭代器

      //内部迭代器：本身是函数，该函数内部定义迭代规则，完全接手整个迭代过程，外部只需要一次初始调用
              // Array.prototype.forEach=(){}   内部迭代器
      //外部迭代器：本身是函数，执行返回迭代对象，迭代下一个元素必须显示调用，调用复杂度增加，但灵活性增强

      // function OuterIterator(o) {
      //     let curIndex = 0
      //     let next = () => {
      //      // console.log(curIndex)
      //       return {
      //         value:o[curIndex],
      //         done:o.length == curIndex++
      //       }
      //     }
      //     return {
      //       next
      //     }
      // }
      // let arr = [4,3,8,3,5,6,2,7]
      // let oIt = OuterIterator(arr)

      //next { value:"", done:bollean}   done--->有没有迭代完
      // oIt.next()
      // oIt.next()


      //迭代器的目的 ---》 标准化迭代操作 ---》
                //无论是数组还是对象或者是其他的都可以使用同一套迭代操作---无论是数组还是对象或者是map或者set的结构,arguments
      
                  
          //symbol数据结构   具备唯一性
             //使用：Symbol
                // let ss = Symbol('sss')
                // console.log(ss, typeof ss)

                // let cst = Symbol({
                //   name:'cst'
                // })
                // console.log(cst)






              //给obj写一个迭代器，用来迭代   Array有自己的迭代器
                  // let obj = {
                  //   0:"a",
                  //   1:'b',
                  //   2:"c",
                  //   length:4,
                  //   [Symbol.iterator] : function() {
                  //       let curIndex = 0
                  //       let next = () => {
                  //           return {
                  //              value:this[curIndex],
                  //              done:this.length == ++curIndex
                  //           }
                  //       }
                  //       return {
                  //         next
                  //       }
                  //   }
                  // }

                  // console.log([...obj])


//《---------------------------------------------------------------------------------------------------》
        //Generator ----> 生成器，生成一个迭代对象

//简介：生成器本身是函数，执行后返回迭代对象，函数内部要配合yield使用，用Generator函数会分段实行，遇到yield即暂停
    
      //特点： function和函数之间需要带*
              //函数体内部yeild表达式，产出不同的内部状态（值）

      //上代码：




      // function *text() {  //生成器函数
      //     yield 'a'
      //     console.log(1)
      //     yield 'b'
      //     console.log(2)
      //     yield 'c'
      //     console.log(3)
      //     return 'd'
      // }

      // let oG = text()  //oG是一个迭代对象，里面有next方法
      // console.log(oG.next())
      //     // {
      //     //   value:'a',
      //     //   done:false
      //     // }

      //     //end
      // console.log(oG.next())    //1
      //     // {
      //     //   value:'b',
      //     //   done:false
      //     // }
      //     //  1
      //     //end
      
      //  console.log(oG.next())  //2
      //      // {
      //     //   value:'c',
      //     //   done:false
      //     // }
      //     //  2
      //     //  end
      //  console.log(oG.next())  //3
      //      // {
      //     //   value:'d',
      //     //   done:true
      //     // }
      //     //  3
      //     //  end




      // function *text() {  
      //     let value1 = yield 'a'    // 第一次执行时只执行yiled 'a',停止，不会执行let value1 = 这个赋值操作
      //     console.log(value1)
      //     let value2 = yield 'b'    //第二次执行next时，执行let value1 = 的赋值操作，在执行yield操作停止
      //     console.log(value2)
      //     let value3 = yield 'c'    //一次类推
      //     console.log(value3)
      //     return 'd'
      // }

      // let oG = text()
      // oG.next()       //





      // function *text() {  
      //     let value1 = yield 'a'    //  第一次执行时只执行yiled 'a',停止，不会执行let value1 = 这个赋值操作
      //     console.log(value1,1)            // 打印的传入的值
      //     let value2 = yield 'b'    //第二次执行next时，执行let value1 = 的赋值操作，如果传递值，value1就是传入分的值
      //     console.log(value2,2)
      //     let value3 = yield 'c'    //一次类推
      //     console.log(value3,3)
      //     return 'd'
      // }

      // let oG = text()
      // console.log( oG.next() )     //执行
      // console.log( oG.next('kaizi') )


           //迭代器
                // let obj = {
                //     0:"a",
                //     1:'b',
                //     2:"c",
                //     length:3,
                //     [Symbol.iterator]: function*() {
                //         let curIndex = 0
                //         while(curIndex != this.length) {
                //           yield this[curIndex]
                //           curIndex+=1
                //         }
                //     }
                //   }

                //   console.log(...obj)

//-------------------------------------async await -------------------------->
    //查promisify


    

   //async and await         ----在其他文件中操作文本

//    function add(data) {
//         return new Promise((resolve,reject) => {
//             data += 1
//             if(data) {
//                 resolve(data)
//             } else {
//                 reject(data)
//             }
//         })
//     }

 


  //   function *num(data) {
  //       let add1 = yield add(data)
  //       let add2 = yield add(add1)
  //       let add3 = yield add(add2)
  //       return add3
  //   }


//-------------------------------------co对象--------------------------------------------》
  //  function Co(oIt) {
  //     return new Promise((resolve,reject) => {
  //         let next = (data) => {
  //             let {value, done} = oIt.next(data)
  //             if(done) {
  //                 resolve(value)
  //                 return
  //             }
  //             value.then(res => {
  //                 next(res)
  //             })
  //         }
  //         next()
  //     })
  //  }

  //  Co(num(5)).then(res => {
  //    console.log(res)
  //  })
  


    // async function getNum(data) {
    //     let add1 = await add(data)
    //     let add2 = await add(add1)
    //     let add3 = await add(add2)
    //     let add4 = await add(add3)
    //     return add4
    // }
    // getNum(5).then(res => {
    //    console.log(res)
    // })

   

    //           var x = 10
    //           function show(a, b) {
    //                console.log(this.x, a, b)
    //           }


    //           var obj = {
    //               x:20
    //           }

    //           // var newShow = show.bind(obj,'c','d')
    //           // newShow()


    //           var newShow = show.bind(obj,'c')
    //           newShow('d')





   
 
    // Function.prototype.myBind = function(target) {
    //    let _this = this
    //    let _arg = [].slice.call(arguments,1)
    //    function temp() {}
    //    let f = function() {
    //        let arg = [].slice.call(arguments,0)
    //        return _this.apply(this instanceof temp ? this :(target || window),_arg.concat(arg))
    //    }
    //    temp.prototype = _this.prototype
    //    f.prototype = new temp()
    //    return f
    // }




    //   var obj = {
    //       name:"bai"
    //   }

  
    //   function sayName() {
    //       console.log(this.name)
    //   }
    
    // let say = sayName.myBind(obj)
    // say()




    //----------------------->eS6中class的this指向<------------------------

// class Logger{
//     printName(name = 'there'){
//         console.log(this)
//         this.print(`hello ${name}`);
//     }
//     print(text){
//         console.log(text);
//     }
// }
// const logger = new Logger();    //实例化
// const { printName } = logger;    //printName
// printName(); // 报错    VM77:3 Uncaught TypeError: Cannot read property 'print' of undefined    es6的class中默认的是严格模式




//    // 默认new 出来了
// class Logger{
//     printName = (name = 'there') => {
//         console.log(this)
//         this.print(`hello ${name}`);
//     }
//     print = (text) => {
//         console.log(text);
//     }
// }


// const logger = new Logger();    //实例化
// const { printName } = logger;    //printName
// printName(); 


 



// let obj = {
//   name:'kaikai'
// }

// let value = obj.name
// Object.defineProperty(obj,'name',{
//    get() {
//       return value
//    },
//    set(newVal) {
//      console.log(999)
//      value = newVal
//    }
// })
</script>
</html>